Docker : Docker Swarm
2017/08/03 |
Configure Docker Swarm to create Docker Cluster with multiple Docker nodes.
On this example, Configure Swarm Cluster with 3 Docker nodes like follows.
There are 2 roles on Swarm Cluster, those are [Manager nodes] and [Worker nodes]. This example shows to set those roles like follows. -----------+---------------------------+--------------------------+------------ | | | eth0|10.0.0.51 eth0|10.0.0.52 eth0|10.0.0.53 +----------+-----------+ +-----------+----------+ +-----------+----------+ | [ node01.srv.world ] | | [ node02.srv.world ] | | [ node03.srv.world ] | | Manager | | Worker | | Worker | +----------------------+ +----------------------+ +----------------------+ |
[1] | |
[2] | Configure Swarm Cluster on Manager Node. |
root@node01:~# docker swarm init Swarm initialized: current node (vcns353o59ye47zw5mi7dmdua) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-2nz54ltw9rshwlkqrmrhm83yqjje6wdd94ymxrx_ zzt5h4qtuxn-au471rbfach5zq8niqygz7xsv 10.0.0.51:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions. |
[3] | Join in Swarm Cluster on all Worker Nodes. It's OK to run the command which was shown when running swarm init on Manager Node. |
root@node02:~# docker swarm join \ --token SWMTKN-1-2nz54ltw9rshwlkqrmrhm83yqjje6wdd94ymxrxzzt5h4qtuxn-au471rbfach5zq8niqygz7xsv \ 10.0.0.51:2377 This node joined a swarm as a worker. |
[4] | Verify with a command [node ls] that worker nodes could join in Cluster normally. |
root@node01:~# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS tavuctuc6vhlccqk3fnl6nv2e node02.srv.world Ready Active vcns353o59ye47zw5mi7dmdua * node01.srv.world Ready Active Leader woeo3nhvlv3tin793n8k677v0 node03.srv.world Ready Active |
[5] |
After creating Swarm Cluster, next, configure services that the Swarm Cluster provides.
Create the same container image on all Nodes for the service first. On this exmaple, use a Container image which provides http service like an example of the link. |
[6] | Configure service on Manager Node. After successing to configure service, access to the Manager node's Hostname or IP address to verify it works normally. By the way, requests to worker nodes are load-balanced with round-robin like follows. |
root@node01:~# docker images REPOSITORY TAG IMAGE ID CREATED SIZE web_server latest fc43f53a680b 6 seconds ago 296MB debian latest a20fd0d59cf1 10 days ago 100MB # create a service with 2 repricas root@node01:~# docker service create --name swarm_cluster --replicas=2 -p 80:80 web_server:latest m7zmin5vo21qu7i3crkytxpq6 # show service list root@node01:~# docker service ls ID NAME MODE REPLICAS IMAGE PORTS m7zmin5vo21q swarm_cluster replicated 2/2 web_server:latest *:80->80/tcp # inspect the service root@node01:~# docker service inspect swarm_cluster --pretty ID: m7zmin5vo21qu7i3crkytxpq6 Name: swarm_cluster Service Mode: Replicated Replicas: 2 Placement: UpdateConfig: Parallelism: 1 On failure: pause Monitoring Period: 5s Max failure ratio: 0 Update order: stop-first RollbackConfig: Parallelism: 1 On failure: pause Monitoring Period: 5s Max failure ratio: 0 Rollback order: stop-first ContainerSpec: Image: web_server:latest Resources: Endpoint Mode: vip Ports: PublishedPort = 80 Protocol = tcp TargetPort = 80 PublishMode = ingress # show service state root@node01:~# docker service ps swarm_cluster ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ixth3hy90ufk swarm_cluster.1 web_server:latest node02.srv.world Running Running about a mi.. hze4wl2w8a18 swarm_cluster.2 web_server:latest node01.srv.world Running Running about a mi.. # verify it works normally root@node01:~# curl http://node01.srv.world/ node02 root@node01:~# curl http://node01.srv.world/ node01 root@node01:~# curl http://node01.srv.world/ node02 root@node01:~# curl http://node01.srv.world/ node01 |
[7] | If you'd like to change the number of repricas, configure like follows. |
# change repricas to 3 root@node01:~# docker service scale swarm_cluster=3 swarm_cluster scaled to 3 root@node01:~# docker service ps swarm_cluster ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ixth3hy90ufk swarm_cluster.1 web_server:latest node02.srv.world Running Running 3 minute.. hze4wl2w8a18 swarm_cluster.2 web_server:latest node01.srv.world Running Running 3 minute.. lfi7vo0gvcf0 swarm_cluster.3 web_server:latest node03.srv.world Running Running 3 second.. # verify working root@node01:~# curl http://node01.srv.world/ node02 root@node01:~# curl http://node01.srv.world/ node03 root@node01:~# curl http://node01.srv.world/ node01 |